package modelo;

import java.util.ArrayList;

import titiritero.Dibujable;
import utilitarios.*;

public abstract class Arma extends ObjetoEstatico {
	
	protected static int BALAS = 100;
	protected static final int VELOCIDAD_MINIMA = 1;
	protected static final int VELOCIDAD_MEDIA = 2;
	protected static final int VELOCIDAD_MAXIMA = 3;
	
	protected String tipoDeArma;
	protected ArrayList<Proyectil> arsenal;
	protected double velocidadDisparo;
	protected int danio;

	public Arma(Escenario escenario) {
		super(escenario);
	}
	
	public String getTipoDeArma(){
		return this.tipoDeArma;
	}
	
	public int getDanio() {
		return this.danio;
	}
	
	public double getVelocidadDisparo() {
		return this.velocidadDisparo;
	}
	
	protected void setVelocidadDisparo(double velocidad) {
		this.velocidadDisparo = velocidad;
	}
	
	public int cantidadBalas() {
		return this.arsenal.size();
	}
	
	 /**
     * Carga proyectiles en el arma. 
     * Estos proyectiles tienen posicion, danio y velocidad indicada por el arma.
     */
    public void cargarProyectiles() {
        for (int i = 0; i < BALAS; i++) {
            Proyectil proyectil = new Proyectil(this.escenario, this.getFigura().getCentroMasa());
            proyectil.setDanio(this.danio);
            proyectil.setVelocidad(this.velocidadDisparo);
            this.arsenal.add(proyectil);
        }
    }
	
	public Proyectil descargar() throws IndexOutOfBoundsException {
		return arsenal.remove(0);
	}
	
	/** Dispara una bala desde una posicion y hacia una direccion.
	 * @param posicionInicial
	 * @param direccion
	 * @param escenario
	 */
	public void disparar(PuntoXY posicionInicial, Direccion direccion) {
		try {
			Proyectil proyectil = this.descargar();
			proyectil.setPosicion(posicionInicial);
			this.escenario.agregarProyectil(proyectil);

			PuntoXY posicion = posicionInicial.sumarPunto( (direccion.getVector().productoEscalar(proyectil.getFigura().getDistanciaAlBorde())));
			proyectil.setPosicion(posicion);
			proyectil.setDireccion(direccion);
			proyectil.seMovera(direccion);
			
		} catch (IndexOutOfBoundsException er) {
		    // No hay mas armas para disparar.
			}
	}
	
	@Override
    public void chocarConAlgoTank(TanqueAlgo tanque) {
		tanque.chocarConArma(this);
		this.resistencia = 0;
	}
	
	@Override
    public void chocarConTanqueEnemigo(TanqueEnemigo tanque) {
		tanque.chocarConArma(this);
	}
	
	@Override
    public void chocarConProyectil(Proyectil unProyectil) {
		unProyectil.chocarConArma(this);
	}

	@Override
    public void chocarConPared(Pared unaPared) {
	}

	@Override
    public abstract Dibujable crearDibujable();

}

